#include "detect.h"
#include "selectROIs.h"

bool manuDetect(cv::Mat& img, std::vector<cv::Rect>& bboxes) {
    //selectROIs(img, bboxes);  // Debug
    bboxes.push_back(cv::Rect(423, 55, 71, 73));
    bboxes.push_back(cv::Rect(426, 235, 71, 74));
    return bboxes.size() > 0;
}

bool colorDetect(cv::Mat& img, std::vector<cv::Rect>& bboxes, cv::Scalar c1, cv::Scalar c2, double r1, double r2) {
    bboxes.clear();
    cv::Mat temp;
    cv::cvtColor(img, temp, cv::COLOR_BGR2HSV);
    cv::inRange(temp, c1, c2, temp);
    cv::Mat SE = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 3));
    cv::morphologyEx(temp, temp, cv::MORPH_OPEN, SE);
    cv::morphologyEx(temp, temp, cv::MORPH_CLOSE, SE);
    std::vector<std::vector<cv::Point>> contours;
    cv::findContours(temp, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
    double minArea = r1 * r1 * CV_PI;
    double maxArea = r2 * r2 * CV_PI;
    for (auto contour : contours) {
        double area = cv::contourArea(contour);
        if (area >= minArea && area <= maxArea) {
            auto bbox = cv::boundingRect(contour);
            bboxes.push_back(bbox);
        }
    }
    return bboxes.size() > 0;
}

bool circleDetect(cv::Mat& img, std::vector<cv::Rect>& bboxes, int r1, int r2) {
    bboxes.clear();
    cv::Mat temp = img.clone();
    if (img.channels() == 3) {
        cv::cvtColor(img, temp, cv::COLOR_BGR2GRAY);
    }
    std::vector<cv::Vec3i> circles;
    cv::HoughCircles(temp, circles, cv::HOUGH_GRADIENT, 2, r1 / 4, 100, 80, r1, r2);
    for (auto& circle : circles) {
        int radius = circle[2];
        int x1 = circle[0] - radius;
        int y1 = circle[1] - radius;
        int side = 2 * radius;
        auto bbox = cv::Rect(x1, y1, side, side);
        bboxes.push_back(bbox);
    }
    return bboxes.size() > 0;
}
